package com.david.current;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Semaphore;
/**
 * 使用 信号量完成有界容器的设置，并接很好的支持并发（类似的还有连接池等）
* @author david 
* 
* @param <T> 
*
 */
public class BoundedHashSet<T> {
    
	private final Set<T> set;
	//信号量 资源限制，只允许一定数量的并发线程操作
	private final Semaphore sem;
	
	public BoundedHashSet(int bound){
		this.set=Collections.synchronizedSet(new HashSet<T>());
		this.sem=new Semaphore(bound);
	}
	
	public boolean add(T o) throws InterruptedException{
		//从此信号量获取一个许可，在提供一个许可前一直将线程阻塞，否则线程被中断。
		sem.acquire();
		boolean wasAdded=false;
		try {
			wasAdded=set.add(o);
			return wasAdded;
		} finally{
			//如果添加失败释放掉锁
			if(!wasAdded){
				sem.release();
			}
			
		}
	}
	//容器删除一个目标，释放一个许可
	public boolean remove(T o){
		boolean wasAdded = set.remove(o);
		if(wasAdded){
			sem.release();
		}
		return wasAdded;
	}
	/** 
	 * @param args 
	 */

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}
